package mtt.us.client.views.fachbereich;

import hmvc4gwt.client.event.HmvcEvent;

import mtt.us.client.events.GetModelDataEvent;
import mtt.us.client.events.ShowFachbereichViewEvent;
import mtt.us.client.views.fachbereich.editor.FachbereichEditorController;
import mtt.us.client.views.fachbereich.editor.FachbereichEditorView;
import mtt.us.client.views.fachbereich.editor.FachbereicheEditorModel;
import mtt.us.client.views.fachbereich.editor.events.ShowFachbereichEditorEvent;
import mtt.us.client.views.fachbereich.events.CreateFachbereichEvent;
import mtt.us.client.views.fachbereich.events.EditFachbereichEvent;
import mtt.us.client.views.fachbereich.events.ShowFachbereicheEvent;
import mtt.us.client.views.fachbereich.events.ShowStudiengaengeEvent;
import mtt.us.client.views.fachbereich.events.ShowStudiengangViewEvent;
import mtt.us.client.views.fachbereich.events.StoreFachbereicheEvent;
import mtt.us.client.views.fachbereich.studiengang.StudiengangController;
import mtt.us.client.views.fachbereich.studiengang.StudiengangModel;
import mtt.us.client.views.fachbereich.studiengang.StudiengangView;
import mtt.us.dto.FachbereichDTO;
import mtt.us.hmvcFramework.client.hmvc.controller.GuiController;
import mtt.us.hmvcFramework.client.hmvc.events.AddViewEvent;
import mtt.us.hmvcFramework.client.hmvc.events.CloseViewEvent;
import mtt.us.hmvcFramework.client.hmvc.events.RemoveViewEvent;

public class FachbereichController extends GuiController {

	/**
	 * zeigt ein Widget zum hinzufügen einees Fachbereichs an
	 */
	private void createFachbereich() {
		addChildTriad(new FachbereicheEditorModel(),
				new FachbereichEditorView(), new FachbereichEditorController());
		fireEvent(new ShowFachbereichEditorEvent(), false, false, true);
	}

	public void doInitImpl() {

		/*
		 * Controller für ShowMainWidgetEvents registrieren
		 */
		register(ShowFachbereichViewEvent.class, this);
		register(CloseViewEvent.class, this);

		register(ShowStudiengaengeEvent.class, this);
		register(EditFachbereichEvent.class, this);
		register(CreateFachbereichEvent.class, this);
		register(ShowFachbereicheEvent.class, this);
		register(StoreFachbereicheEvent.class, this);

	}

	/**
	 * zeigt ein Widget an um den Fachbereich zu editieren
	 * 
	 * @param fachbereich
	 */
	private void editFachbereich(FachbereichDTO fachbereich) {
		addChildTriad(new FachbereicheEditorModel(fachbereich),
				new FachbereichEditorView(), new FachbereichEditorController());
		fireEvent(new ShowFachbereichEditorEvent(), false, false, true);
	}

	public void handleEventImpl(HmvcEvent event) {

		if (event instanceof ShowFachbereichViewEvent) {

//			showView = true;

			fireLocalEvent(new GetModelDataEvent());
			
			showFachbereiche();
			
//			fireEvent(new GetListFachbereichEvent(), true, false, false);

		} else if (event instanceof ShowStudiengaengeEvent) {
			showStudiengänge((FachbereichDTO) event.getPayload());
		} else if (event instanceof EditFachbereichEvent) {
			editFachbereich((FachbereichDTO) event.getPayload());
		} else if (event instanceof CreateFachbereichEvent) {
			createFachbereich();
		} else if (event instanceof ShowFachbereicheEvent) {
			showFachbereiche();
		} else if (event instanceof StoreFachbereicheEvent) {
			storeFachbereich((StoreFachbereicheEvent) event);
		} else if (event instanceof CloseViewEvent) {
			fireEvent(new RemoveViewEvent(getView()), true, false, false);
		}
	}

	private void storeFachbereich(StoreFachbereicheEvent event) {
		// Fachbereich speichern
		
		showFachbereiche();
	}

	private void showFachbereiche() {
		fireEvent(new AddViewEvent(getView()), true, false, false);
	}

	/**
	 * zeigt die Studiengänge des Fachbereichs an und übergibt die Kontrolle dem
	 * StudiengangController
	 * 
	 * @param fachbereich
	 */
	private void showStudiengänge(FachbereichDTO fachbereich) {
		addChildTriad(new StudiengangModel(fachbereich), new StudiengangView(),
				new StudiengangController());
		
		ShowStudiengangViewEvent event = new ShowStudiengangViewEvent();
		fireEvent(event, false, false, true);
	}
}
